﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     dev
**Author:      MiPeng
**Date:        2021/12/21
**Description: 实现点击滑动条，滑块跳转到指定位置
*****************************************************/

#ifndef SLIDER_H
#define SLIDER_H

#include "../generalui_global.h"
#include "../GlobalUIDef.h"

#include <QSlider>

namespace GeneralUI {

	class GENERALUI_EXPORT Slider : public QSlider
	{
		Q_OBJECT

	public:
		explicit Slider(QWidget *parent = nullptr);
		explicit Slider(Qt::Orientation orientation, QWidget *parent = nullptr);
		~Slider();

	public:
		/**
		 * @brief  setDecimals  浮点数滑动条设置精度
		 * @param  decs  精度
		 * @return void
		 */
		void setDecimals(int decs);

		/**
		 * @brief  getDecimals  获取精度
		 * @return int
		 */
		int getDecimals();

		/**
		 * @brief  setValue  设置当前值
		 * @param  value
		 * @return void
		 */
		void setValue(double value);

		/**
		 * @brief  value  获取当前值
		 * @return double
		 */
		double value();

		/**
		 * @brief  setRange  设置最值
		 * @param  min  最小
		 * @param  max  最大
		 * @return void
		 */
		void setRange(double min, double max);

		/**
		 * @brief  setMinimum  设置最小值
		 * @param  min
		 * @return void
		 */
		void setMinimum(int min);

		/**
		 * @brief  setMaximum  设置最大值
		 * @param  max
		 * @return void
		 */
		void setMaximum(int max);

		/**
		 * @brief  maximum  最大值
		 * @return double
		 */
		double maximum();

		/**
		 * @brief  minimum  最小值
		 * @return double
		 */
		double minimum();

		/**
		 * @brief  setSingleStep  设置步进大小
		 * @param  singleStep
		 * @return void
		 */
		void setSingleStep(double singleStep);

		/**
		 * @brief  singleStep  获取步进大小
		 * @return double
		 */
		double singleStep()const;

		/**
		 * @brief  hasFocus  是否具有焦点
		 * @return bool
		 */
		bool hasFocus();

	Q_SIGNALS:
		/**
		 * @brief  signalValueChanged  数值变化信号
		 * @param  value  值
		 * @param  isLast 是否最后一次信号
		 * @return void
		 */
		void signalValueChanged(double value, bool isLast = false);

	protected:
		/**
		 * @brief  mousePressEvent  鼠标点击事件
		 * @param  event
		 * @return void
		 */
		void mousePressEvent(QMouseEvent *event)override;

		/**
		 * @brief  mouseMoveEvent  鼠标移动事件
		 * @param  event
		 * @return void
		 */
		void mouseMoveEvent(QMouseEvent *event)override;

		/**
		 * @brief  mouseReleaseEvent  鼠标释放事件
		 * @param  event
		 * @return void
		 */
		void mouseReleaseEvent(QMouseEvent *event)override;

		/**
		 * @brief  wheelEvent  鼠标滚轮事件
		 * @param  event
		 * @return
		 */
		void wheelEvent(QWheelEvent *event)override;

		/**
		 * @brief  enterEvent  判断鼠标焦点事件
		 * @param  event
		 * @return void
		 */
		void enterEvent(QEvent *event)override;
		void leaveEvent(QEvent *event)override;

		private Q_SLOTS:
		/**
		 * @brief  notifyValueChanged  通知数值变化
		 * @param  isLast 是否最后一次信号
		 * @return void
		 */
		void notifyValueChanged(const bool isLast);

	private:
		/**
		 * @brief  init  初始化参数
		 * @return void
		 */
		void init();

		/**
		 * @brief  initForm  精度变化后调整对应参数
		 * @return void
		 */
		void initForm(double newMultiple);

	private:
		int m_decimals;												/// 浮点数输出时输出精度，默认为0
		int m_multiple;												/// 数值映射倍数
		int m_lastOrignalValue;										/// 上一次的值
		bool m_hasMouseFocus;										/// 鼠标焦点
	};

}

#endif // SLIDER_H
